package com.ruoyi.common.utils;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

public class OldPhotoEffect {

    // 加载 OpenCV 库
    static {
        System.load("D:\\Program Files\\opencv\\build\\java\\x64\\opencv_java490.dll");
    }
    public static void main(String[] args) {
    // 读取图片
    String imagePath = "D:\\BaiduNetdiskDownload\\scd3.jpg"; // 替换为你的图片路径
    Mat image = Imgcodecs.imread(imagePath);

        if (image.empty()) {
        System.out.println("无法加载图片");
        return;
    }

    // 应用做旧效果
    Mat agedImage = applyAgingEffect(image);

    // 保存结果图片
        Imgcodecs.imwrite("D:\\BaiduNetdiskDownload\\aged_image.jpg", agedImage);
        System.out.println("图片已处理并保存为 aged_image.jpg");
}

    // 做旧效果方法
    public static Mat applyAgingEffect(Mat originalImage) {
        // 创建一个新的 Mat 对象以存储做旧效果的图片
        Mat agedImage = new Mat();

        // 转换为灰度图
        Imgproc.cvtColor(originalImage, agedImage, Imgproc.COLOR_BGR2GRAY);

        // 增加棕色调：调整图片的颜色，让其具有老旧的棕色调
        Mat colorImage = new Mat();
        Imgproc.cvtColor(agedImage, colorImage, Imgproc.COLOR_GRAY2BGR);
//        // 调整色调，通过增强红色和黄色的部分
        for (int y = 0; y < colorImage.rows(); y++) {
            for (int x = 0; x < colorImage.cols(); x++) {
                double[] pixel = colorImage.get(y, x);
                // 让图片变得稍微棕色化（增加红色和黄色成分）
                pixel[2] = Math.min(pixel[2] * 0.9, 255);  // Red
                pixel[1] = Math.min(pixel[1] * 0.9, 255);  // Green
                pixel[0] = Math.min(pixel[0] * 1.0, 255);  // Blue
                colorImage.put(y, x, pixel);
            }
        }

        // 模糊：模糊效果模拟岁月的磨损
        Imgproc.GaussianBlur(colorImage, agedImage, new Size(5, 5), 0);

        // 添加划痕：模拟图片上的损伤（比如划痕）
//        addScratches(agedImage);

        return agedImage;
    }

    // 在图片上添加划痕效果
    public static void addScratches(Mat image) {
        for (int i = 0; i < 10; i++) {
            // 随机选择划痕的起始和结束点
            int x1 = (int)(Math.random() * image.cols());
            int y1 = (int)(Math.random() * image.rows());
            int x2 = (int)(Math.random() * image.cols());
            int y2 = (int)(Math.random() * image.rows());

            // 设置划痕的颜色和粗细
            Scalar color = new Scalar(200, 200, 200); // 使用淡灰色模拟划痕
            int thickness = 1 + (int)(Math.random() * 2);  // 随机设置划痕的粗细
            // 绘制线条
            Imgproc.line(image, new Point(x1, y1), new Point(x2, y2), color, thickness);
        }
    }
}

